home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI3 / LEZIONE7t1.s < prev    next >
Text File  |  1994-11-28  |  9KB  |  252 lines

  1.  
  2. ; Lezione7t1.s    stelle
  3.  
  4. ;    In questo listato facciamo un cielo stellato
  5. ;    con uno sprite riutilizzato 127 volte !!!
  6.  
  7.     SECTION    CiriCop,CODE
  8.  
  9. Inizio:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Nome lib
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop
  17.  
  18.  
  19.     MOVE.L    #BITPLANE,d0
  20.     LEA    BPLPOINTERS,A1
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25. ;    Puntiamo gli sprite
  26.  
  27.     MOVE.L    #SPRITE,d0        ; indirizzo dello sprite in d0
  28.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33.     move.l    #COPPERLIST,$dff080    ; nostra COP
  34.     move.w    d0,$dff088        ; START COP
  35.     move.w    #0,$dff1fc        ; NO AGA!
  36.     move.w    #$c00,$dff106        ; NO AGA!
  37.  
  38. mouse:
  39.     cmpi.b    #$ff,$dff006    ; Linea 255?
  40.     bne.s    mouse
  41.  
  42.     bsr.s    MuoviStelle    ; questa routine muove le stelle
  43.  
  44. Aspetta:
  45.     cmpi.b    #$ff,$dff006    ; linea 255?
  46.     beq.s    Aspetta
  47.  
  48.     btst    #6,$bfe001    ; mouse premuto?
  49.     bne.s    mouse
  50.  
  51.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  52.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  53.  
  54.     move.l    4.w,a6
  55.     jsr    -$7e(a6)    ; Enable
  56.     move.l    gfxbase(PC),a1
  57.     jsr    -$19e(a6)    ; Closelibrary
  58.     rts
  59.  
  60. ;    Dati
  61.  
  62. GfxName:
  63.     dc.b    "graphics.library",0,0
  64.  
  65. GfxBase:
  66.     dc.l    0
  67.  
  68. OldCop:
  69.     dc.l    0
  70.  
  71. ; Questa semplice routine fa avanzare lo sprite che costituisce le stelle
  72. ; agendo su ogni HSTART tramite il loop STELLE_LOOP
  73.  
  74. MuoviStelle:
  75.     lea    Sprite,A0        ; a0 punta allo sprite
  76. STELLE_LOOP:
  77.     CMPI.B    #$f0,1(A0)        ; la stella ha raggiunto il bordo
  78.                     ; destro dello schermo ?
  79.     BNE.S    no_bordo        ; no, allora salta
  80.     MOVE.B    #$30,1(A0)        ; si, rimetti la stella a sinistra  
  81. no_bordo:
  82.     ADDQ.B  #1,1(A0)        ; sposta di 2 pixel lo sprite
  83.     ADDQ.w    #8,A0            ; prossima stella
  84.     CMP.L    #SpriteEnd,A0        ; abbiamo raggiunto la fine?
  85.     BLO.S    STELLE_LOOP        ; se no rifai il loop
  86.     RTS                ; fine routine
  87.  
  88.  
  89.     SECTION    GRAPHIC,DATA_C
  90.  
  91. COPPERLIST:
  92. SpritePointers:
  93.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  94.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  95.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  96.     dc.w    $13e,0
  97.  
  98.     dc.w    $8E,$2c81    ; DiwStrt
  99.     dc.w    $90,$2cc1    ; DiwStop
  100.  
  101.     dc.w    $92,$38        ; DdfStart
  102.     dc.w    $94,$d0        ; DdfStop
  103.     dc.w    $102,0        ; BplCon1
  104.     dc.w    $104,0        ; BplCon2
  105.     dc.w    $108,0        ; Bpl1Mod
  106.     dc.w    $10a,0        ; Bpl2Mod
  107.  
  108.             ; 5432109876543210
  109.     dc.w    $100,%0001001000000000
  110.  
  111. BPLPOINTERS:
  112.     dc.w $e0,0,$e2,0    ;primo     bitplane
  113.  
  114.     dc.w    $180,$000    ; color0    ; sfondo nero
  115.     dc.w    $182,$000    ; color1    ; colore 1 del bitplane, che
  116.                         ; in questo caso e' vuoto,
  117.                         ; per cui non compare.
  118.  
  119. ; lo sprite usa un solo colore, il 17
  120.  
  121.     dc.w    $1A2,$ddd    ; color17, - COLOR1 dello sprite0 - bianco
  122.  
  123.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  124.  
  125. ;    -    -    -    -    -    -    -    
  126.  
  127. ; Come potete notare, questo sprite e' riutilizzato un bel po' di volte, per
  128. ; la precisione 127. E' composto di tante coppie di word di controllo seguite
  129. ; da un $1000,$0000, ossia la linea di dati che compone ogni singola stella.
  130. ; Le posizioni verticali vanno di 2 in 2, per cui c'e' una stella ogni 2
  131. ; linee verticali, ad una posizione orizzontale diversa per ogni stella.
  132. ; il primo utilizzo dello sprite e' $307a,$3100,$1000,$0000
  133. ; il secondo e' $3220,$3300,$1000,$0000
  134. ; E cosi' via. I vari VSTART vanno di 2 in 2, infatti sono $30,$32,$34,$36...
  135. ; Gli HSTART sono posizionati casualmente ($7a,$20,$c0,$50...)
  136. ; I Vstop sono chiaramente 1 linea dopo lo start ($31,$33,$35..) essendo le
  137. ; stelle alte 1 pixel.
  138. ; La routine agisce ogni fotogramma su tutti gli HSTART spostando avanti le
  139. ; stelle.
  140.  
  141. Sprite:
  142.     dc.w    $307A,$3100,$1000,$0000,$3220,$3300,$1000,$0000
  143.     dc.w    $34C0,$3500,$1000,$0000,$3650,$3700,$1000,$0000
  144.     dc.w    $3842,$3900,$1000,$0000,$3A6D,$3B00,$1000,$0000
  145.     dc.w    $3CA2,$3D00,$1000,$0000,$3E9C,$3F00,$1000,$0000
  146.     dc.w    $40DA,$4100,$1000,$0000,$4243,$4300,$1000,$0000
  147.     dc.w    $445A,$4500,$1000,$0000,$4615,$4700,$1000,$0000
  148.     dc.w    $4845,$4900,$1000,$0000,$4A68,$4B00,$1000,$0000
  149.     dc.w    $4CB8,$4D00,$1000,$0000,$4EB4,$4F00,$1000,$0000
  150.     dc.w    $5082,$5100,$1000,$0000,$5292,$5300,$1000,$0000
  151.     dc.w    $54D0,$5500,$1000,$0000,$56D3,$5700,$1000,$0000
  152.     dc.w    $58F0,$5900,$1000,$0000,$5A6A,$5B00,$1000,$0000
  153.     dc.w    $5CA5,$5D00,$1000,$0000,$5E46,$5F00,$1000,$0000
  154.     dc.w    $606A,$6100,$1000,$0000,$62A0,$6300,$1000,$0000
  155.     dc.w    $64D7,$6500,$1000,$0000,$667C,$6700,$1000,$0000
  156.     dc.w    $68C4,$6900,$1000,$0000,$6AC0,$6B00,$1000,$0000
  157.     dc.w    $6C4A,$6D00,$1000,$0000,$6EDA,$6F00,$1000,$0000
  158.     dc.w    $70D7,$7100,$1000,$0000,$7243,$7300,$1000,$0000
  159.     dc.w    $74A2,$7500,$1000,$0000,$7699,$7700,$1000,$0000
  160.     dc.w    $7872,$7900,$1000,$0000,$7A77,$7B00,$1000,$0000
  161.     dc.w    $7CC2,$7D00,$1000,$0000,$7E56,$7F00,$1000,$0000
  162.     dc.w    $805A,$8100,$1000,$0000,$82CC,$8300,$1000,$0000
  163.     dc.w    $848F,$8500,$1000,$0000,$8688,$8700,$1000,$0000
  164.     dc.w    $88B9,$8900,$1000,$0000,$8AAF,$8B00,$1000,$0000
  165.     dc.w    $8C48,$8D00,$1000,$0000,$8E68,$8F00,$1000,$0000
  166.     dc.w    $90DF,$9100,$1000,$0000,$924F,$9300,$1000,$0000
  167.     dc.w    $9424,$9500,$1000,$0000,$96D7,$9700,$1000,$0000
  168.     dc.w    $9859,$9900,$1000,$0000,$9A4F,$9B00,$1000,$0000
  169.     dc.w    $9C4A,$9D00,$1000,$0000,$9E5C,$9F00,$1000,$0000
  170.     dc.w    $A046,$A100,$1000,$0000,$A2A6,$A300,$1000,$0000
  171.     dc.w    $A423,$A500,$1000,$0000,$A6FA,$A700,$1000,$0000
  172.     dc.w    $A86C,$A900,$1000,$0000,$AA44,$AB00,$1000,$0000
  173.     dc.w    $AC88,$AD00,$1000,$0000,$AE9A,$AF00,$1000,$0000
  174.     dc.w    $B06C,$B100,$1000,$0000,$B2D4,$B300,$1000,$0000
  175.     dc.w    $B42A,$B500,$1000,$0000,$B636,$B700,$1000,$0000
  176.     dc.w    $B875,$B900,$1000,$0000,$BA89,$BB00,$1000,$0000
  177.     dc.w    $BC45,$BD00,$1000,$0000,$BE24,$BF00,$1000,$0000
  178.     dc.w    $C0A3,$C100,$1000,$0000,$C29D,$C300,$1000,$0000        
  179.     dc.w    $C43F,$C500,$1000,$0000,$C634,$C700,$1000,$0000        
  180.     dc.w    $C87C,$C900,$1000,$0000,$CA1D,$CB00,$1000,$0000        
  181.     dc.w    $CC6B,$CD00,$1000,$0000,$CEAC,$CF00,$1000,$0000
  182.     dc.w    $D0CF,$D100,$1000,$0000,$D2FF,$D300,$1000,$0000        
  183.     dc.w    $D4A5,$D500,$1000,$0000,$D6D6,$D700,$1000,$0000        
  184.     dc.w    $D8EF,$D900,$1000,$0000,$DAE1,$DB00,$1000,$0000        
  185.     dc.w    $DCD9,$DD00,$1000,$0000,$DEA6,$DF00,$1000,$0000        
  186.     dc.w    $E055,$E100,$1000,$0000,$E237,$E300,$1000,$0000        
  187.     dc.w    $E47D,$E500,$1000,$0000,$E62E,$E700,$1000,$0000
  188.     dc.w    $E8AF,$E900,$1000,$0000,$EA46,$EB00,$1000,$0000
  189.     dc.w    $EC65,$ED00,$1000,$0000,$EE87,$EF00,$1000,$0000
  190.     dc.w    $F0D4,$F100,$1000,$0000,$F2F5,$F300,$1000,$0000
  191.     dc.w    $F4FA,$F500,$1000,$0000,$F62C,$F700,$1000,$0000
  192.     dc.w    $F84D,$F900,$1000,$0000,$FAAC,$FB00,$1000,$0000
  193.     dc.w    $FCB2,$FD00,$1000,$0000,$FE9A,$FF00,$1000,$0000
  194.     dc.w    $009A,$0106,$1000,$0000,$02DF,$0306,$1000,$0000
  195.     dc.w    $0446,$0506,$1000,$0000,$0688,$0706,$1000,$0000
  196.     dc.w    $0899,$0906,$1000,$0000,$0ADD,$0B06,$1000,$0000
  197.     dc.w    $0CEE,$0D06,$1000,$0000,$0EFF,$0F06,$1000,$0000
  198.     dc.w    $10CD,$1106,$1000,$0000,$1267,$1306,$1000,$0000
  199.     dc.w    $1443,$1506,$1000,$0000,$1664,$1706,$1000,$0000
  200.     dc.w    $1823,$1906,$1000,$0000,$1A6D,$1B06,$1000,$0000
  201.     dc.w    $1C4F,$1D06,$1000,$0000,$1E5F,$1F06,$1000,$0000
  202.     dc.w    $2055,$2106,$1000,$0000,$2267,$2306,$1000,$0000
  203.     dc.w    $2445,$2506,$1000,$0000,$2623,$2706,$1000,$0000
  204.     dc.w    $2834,$2906,$1000,$0000,$2AF0,$2B06,$1000,$0000
  205.     dc.w    $2CBC,$2D06,$1000,$0000
  206. SpriteEnd
  207.     dc.w     $0000,$0000    ; Finalmente lo sprite riutilizzato ha termine
  208.  
  209.  
  210.     SECTION    PLANEVUOTO,BSS_C
  211. BITPLANE:
  212.     ds.b    40*256
  213.  
  214.     end
  215.  
  216. In questo listato vediamo un classico effetto dell'Amiga.
  217. Il cielo stellato e` realizzato mediante un unico sprite che viene riutilizzato
  218. ben 127 volte, ogni volta ad una posizione verticale differente.
  219. Una singola stella corrisponde ad un singolo utilizzo dello sprite.
  220. Una stella e` alta solo una riga, e contiene un solo pixel colorato con il
  221. colore 17 (cioe` con il primo "piano" a 1 e il secondo a 0).
  222. Gli altri pixel sono tutti trasparenti,cioe` hanno entrambi i "piani" a 0.
  223. Guardiamo come e` formata una singola stella, per esempio quella alla posizione
  224. verticale $a0:
  225.  
  226.     dc.w    $A046,$A100,$1000,$0000
  227.  
  228. Notate che VSTART=$a0 , VSTOP=$a1, HSTART=$46. Una stella occupa in memoria
  229. 4 word, ovvero 8 bytes.
  230. Come vedete VSTART e VSTOP differiscono di 1, il che indica che lo sprite e`
  231. utilizzato per una sola riga. Le 2 word $1000 e $0000 sono i 2 "piani" che
  232. contengono i dati sulla forma della prima e unica riga che forma la stella.
  233. Dopo che e` servito per mostrare la stella alla posizione verticale $a0,
  234. lo sprite viene usato per mostrare una stella alla posizione verticale $a2.
  235. Guardiamo come sono disposti i dati di entrambe le stelle:
  236.  
  237.     dc.w    $A046,$A100,$1000,$0000,$A2A6,$A300,$1000,$0000
  238.  
  239. Come potete vedere, la stella alla posizione verticale $a2, e` fatta nello
  240. stesso modo. Le uniche differenze sono nella posizione verticale (ovviamente)
  241. e anche in quella orizzontale.
  242.  
  243. A questo punto vediamo come funziona la routine MuoviStelle.
  244. La routine modifica la posizione delle stelle, una per volta, cominciando
  245. dalla prima. Per modificare la posizione, viene aggiunto 1 al byte HSTART dello
  246. sprite. Come ben saprete, in questo modo lo sprite viene mosso a destra di 2
  247. pixel, perche` il bit basso di HSTART e` messo nel quarto byte di controllo.
  248. Vedremo nel prossimo esempio come togliere questa limitazione. Poiche` come
  249. abbiamo visto una stella occupa in memoria 8 bytes, ogni volta viene aggiunto
  250. 8 all'indirizzo dello sprite per puntare alla stella seguente.
  251. Quando il puntatore raggiunge l'ultima stella, la routine termina.
  252.